"""采用分步多线程下载的方法.先保证执行了第一步生成了links.txt,
  并下载完了所有片段,再执行本文件进行解码和合并.
  如果把KEY_FILE指定为空字符串,则不解码直接合并
"""

from Crypto.Cipher import AES

## 指定文件夹,解码文件,输出文件名,写入缓存大学(默认即可)
FOLDER = r'F:\Download\富贵开心鬼'
KEY_FILE = 'enc.key'
OUTPUT_FILE = '富贵开心鬼.ts'
BUFFER_SIZE = 1024*1024*20

## 其他变量
cipher = None # 解码器,如果指定了密码文件则生成,否则为None
if (KEY_FILE != ''):
  with open(FOLDER+'\\'+KEY_FILE, 'rb') as f:
    cipher = AES.new(f.read(), AES.MODE_CBC, b'0'*16)
    
files = [] # 需要解码合并的文件表,顺序需要正确,读取links.txt生成
with open(FOLDER+'\\links.txt', 'r') as f:
  lines = f.readlines()
for line in lines:
  files.append(line.split('/')[-1].strip())

## 解码合并
content = b'' # 写入到输出文件的内容,超过缓存时写入并情况
with open(FOLDER+'\\'+OUTPUT_FILE, 'wb') as f:
  for line in files:
    if line == '':
      continue
    print("正在处理"+line)
    # 读取每一个片段
    with open(FOLDER+'\\'+line, 'rb') as f1:
      byts = f1.read()
    # 有解码器则解码
    if cipher:
      byts = cipher.decrypt(byts)
    # 加入到缓存
    content += byts
    # 超过缓存则写入文件
    if len(content) > BUFFER_SIZE:
      f.write(content)
      content = b''
  # 把最后的缓存写入文件
  f.write(content)
  
## 完成!
print("解码合并完成!")
